import { message } from './antd'
import { addSubscriptRequest, refreshToken } from './refreshToken'
import router from '@/router'
import axiosServer from './request'
import {CODE_RELOGIN,CODE_TOKEN_EXPIRED} from '@/utils/constant'

export const handleConfigureAuth = (config: any) => {
    config.headers['Authorization'] = localStorage.getItem('TOKEN') || ''
    return config
}
/**
 * 根据状态码处理错误响应
 * @param errStatus
 * @returns
 */
export const handleNetworkError = (errStatus?: number): Promise<any> => {
    const networkErrMap: any = {
        '400': '错误的请求', // token 失效
        '401': '未授权，请重新登录',
        '403': '拒绝访问',
        '404': '请求错误，未找到该资源',
        '405': '请求方法未允许',
        '408': '请求超时',
        '500': '服务器端出错',
        '501': '网络未实现',
        '502': '网络错误',
        '503': '服务不可用',
        '504': '网络超时',
        '505': 'http版本不支持该请求',
    }
    if (errStatus) {
        message.error(networkErrMap[errStatus] ?? `其他连接错误 --${errStatus}`)
    }
    message.error('无法连接到服务器！')
    return Promise.reject(errStatus)
}

let isResult = true
let timer:any = null
/**
 * 服务器没有响应返回，可能的原因有两种：
 * 1. 服务器崩掉了
 * 2. 前端客户端断网状态
 */
export const handleNoResponseError = (error: any) => {
    if (!window.navigator.onLine) {
        message.error('网络不可用,请检查您的网络连接!')
    } else {
        // if(isResult){
        //     isResult = false
        //     message.error('连接服务端出错!' + error?.message)
        //     if(timer) return
        //     timer = setTimeout(()=>{
        //         isResult = true
        //     },500)
        // }
        message.error('连接服务端出错!' + error?.message)
    }
    return Promise.reject(error)
}

export const handlerRefreshToken = (response: any): Promise<any> => {
    const { config } = response
    return new Promise(resolve => {
        // token过期刷新token
        if (response.data.resultCode === CODE_TOKEN_EXPIRED && !config.reply) {
            config.reply = true //去重复请求,比如两次删除商品操作，第二次不保存
            // 1. 构造当前请求
            const request = () => {
                const { method, url, data, params } = config
                const axiosPromise: Promise<any> = axiosServer({
                    method,
                    url,
                    data,
                    params,
                })
                resolve(axiosPromise)
            }
            // 2. 保存当前请求
            addSubscriptRequest(request)

            // 3. 使用长token刷新短token
            refreshToken()
        } else if (response.data.resultCode === CODE_RELOGIN) {
            // 4. 长token过期重新登录
            router.replace('/login')
        } else {
            // 5. 正常请求
            resolve(response.data)
        }
    })
}
